之前Day 7 時只有提到將開發到一半的進度利用git stash暫存起來
今天來介紹詳細一點git stach的使用
當在開發時,你的master分支上有一堆開發中的程式
此時有個緊急的問題進來要除錯修改
這時候我們第一時間就會想要從master其中一個commit的版本來做一個分支出來除錯
不過沒有將做一半的部分commit上去的話是無法reset成任何一個commit,也無法切換branch
目前master上與HEAD的差別就是
我們編輯了index.html
新增了dada.json
線圖如下
最上面的Uncommitted changes指的就是index.html及data.json的異動
這時候我們要將上面的異動加入暫存區域 (stage area)
git add .
加入之後我們就可以存放這些開發到一半的部分了
$ git stash save "just modify index.html and add dada.json"
Saved working directory and index state On master: just modify index.html and add dada.json
HEAD is now at 8a7738a master keep going
我用的指令是git stash save "message"
你也可以使用git stash
差別在於用save我可以帶我自己要識別stash的message
現在master的線圖就會回到master的HEAD上了
列出現在有哪些stash
$ git stash list
stash@{0}: On master: just modify index.html and add dada.json
還原剛才利用stash指令存放到的部分
$ git stash apply
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: data.json
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: index.html
還原後會發現,這些部分沒有如存放前放到暫存區域 (stage area)
如果你希望這些檔案有回到之前的暫存區域 (stage area)內
跟存放前的狀態一樣的話
要加上參數 --index
$ git stash apply --index
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: data.json
modified: index.html
如此一來就跟存放前的狀態一樣了
此外git apply 預設會是抓取最近一次的stash
若要指定特定的stash 要加上 stash名稱
git stash apply stash@{0}
git stash apply與git stash pop的差別是
pop會將取出後的stash移除
apply則會保留
當我們儲存stash後的的master或是其他commit有繼續開發,當我們要還原stash的資料時會碰到問題
或是需要解決合併衝突
不過我們可以透過從stash建立分支這個功能讓stash的部分變成一個新的分支
接下來就可以比照之前兩個分支的合併來處理
從stash建立分支語法為
$ git stash branch testchanges
Switched to a new branch "testchanges"